/**
 * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
 */
package com.jeesite.modules.storage.service;

import com.jeesite.common.entity.Page;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.service.CrudService;
import com.jeesite.modules.storage.common.MemberType;
import com.jeesite.modules.storage.common.SmsType;
import com.jeesite.modules.storage.dao.MemberDao;
import com.jeesite.modules.storage.entity.Member;
import com.jeesite.modules.storage.entity.VipMember;
import com.jeesite.modules.storage.util.WebUtil;
import io.swagger.models.auth.In;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.Map;

/**
 * 会员Service
 */
@Service
@Transactional(readOnly=true)
public class MemberService extends CrudService<MemberDao, Member> {

	@Autowired
	private SmsService smsService;

	@Autowired
	private VipMemberService vipMemberService;
	
	/**
	 * 获取单条数据
	 * @param member
	 * @return
	 */
	@Override
	public Member get(Member member) {
		return super.get(member);
	}
	
	/**
	 * 查询分页数据
	 * @param member 查询条件
	 * @param
	 * @return
	 */
	@Override
	public Page<Member> findPage(Member member) {
		return super.findPage(member);
	}
	
	/**
	 * 保存数据（插入或更新）
	 * @param member
	 */
	@Override
	@Transactional(readOnly=false)
	public void save(Member member) {
		super.save(member);
	}
	
	/**
	 * 更新状态
	 * @param member
	 */
	@Override
	@Transactional(readOnly=false)
	public void updateStatus(Member member) {
		super.updateStatus(member);
	}
	
	/**
	 * 删除数据
	 * @param member
	 */
	@Override
	@Transactional(readOnly=false)
	public void delete(Member member) {
		super.delete(member);
	}

	/**
	 * 根据手机号或者微信openid查找会员
	 * @param platform 平台【APP或H5】
	 * @param phone 手机号
	 * @param openId 微信openid
	 * @return 会员对象
	 */
	public Member getByPhoneOrOpenId(String platform,String phone,String openId){
		return dao.findByPhoneOrOpenId(platform,phone,openId);
	}

	/**
	 * 根据手机号或者微信openid查找会员id
	 * @param platform 平台【APP或H5】
	 * @param phone 手机号
	 * @param openId 微信openid
	 * @return 会员id
	 */
	public String getIdByPhoneOrOpenId(String platform,String phone,String openId){
		return dao.findIdByPhoneOrOpenId(platform,phone,openId);
	}

	/**
	 * 检查会员
	 * @param platform 平台【APP或H5】
	 * @param phone 手机号
	 * @param openId 微信openid
	 * @return 检查结果
	 * 501 未找到
	 * 502 未绑定手机号
	 * 503 未绑定微信
	 * 504 已找到
	 */
	private Integer check(String platform, String phone , String openId){
		Member member = getByPhoneOrOpenId(platform,phone,openId);
		if(member == null){
			return 501;
		}
		if(!member.getIsBindPhone()){
			return  502;
		}
		if(!member.getIsBindWechat()){
			return  503;
		}
		if(member.getIsBindPhone() && member.getIsBindWechat()){
			return 504;
		}
		return 500;
	}

	/**
	 * 手机号注册会员
	 * @param platform 平台【APP或H5】
	 * @param phone 手机号
	 * @param unionId 微信UnionId
	 * @param openId 微信OpenId
	 * @param avatar 微信头像
	 * @param nickName 微信昵称
	 */
	private void register(String platform,String phone , String unionId , String openId , String avatar, String nickName){
		Member member = new Member();
		member.setPlatform(platform);
		VipMember filterVipMember = new VipMember();
		filterVipMember.setPhone(phone);
		VipMember vipMember = vipMemberService.get(filterVipMember);
		if(vipMember!=null){
			member.setType(MemberType.VIP_TYPE);
		}else{
			if(platform.equals("APP")){
				member.setType(MemberType.DIRECT_CUSTOMER_TYPE);
			}else if(platform.equals("H5")){
				member.setType(MemberType.INDIRECT_CUSTOMER_TYPE);
			}
		}
		member.setPhone(phone);
		member.setUnionId(unionId);
		member.setOpenId(openId);
		member.setAvatar(avatar);
		member.setNickName(nickName);
		member.setIsBindPhone(true);
		member.setIsBindWechat(StringUtils.isNotBlank(openId));
		super.save(member);
	}

	/**
	 * 手机注册
	 * @param platform 平台【APP或H5】
	 * @param phone 手机号
	 * @param code 验证码
	 * @return 注册结果
	 * 500 其它
	 * 501 未发送验证码
	 * 502 验证码错误
	 * 503 验证码已过期
	 * 504 已注册，未绑定微信
	 * 505 已注册，直接登录
	 */
	@Transactional(readOnly=false)
	public Integer registerPhone(String platform,String phone, String code) {
		/**
		 * 检查验证码
		 * 501 未发送验证码
		 * 502 验证码错误
		 * 503 验证码已过期
		 */
		Integer	result = smsService.check(SmsType.PHONE_REGISTER_TYPE,phone,code);
		if (result != 200){
			return result;
		}

		/**
		 * 检查会员
		 * 501 未找到
		 * 502 未绑定手机号
		 * 503 未绑定微信
		 * 504 已找到
		 */
		switch (check(platform,phone,null)){
			case 501:
			{
				register(platform,phone,null,null,null,null);
				return 200;
			}
			case 503:
			{
				return 504;
			}
			case 504:
			{
				return 505;
			}
			default:
			{
				return 500;
			}
		}
	}

	/**
	 * 手机登录
	 * @param platform 平台【APP或H5】
	 * @param phone 手机号
	 * @param code 验证码
	 * @return 登录结果
	 * 500 其它
	 * 501 未发送验证码
	 * 502 验证码错误
	 * 503 验证码已过期
	 * 504 未注册
	 * 505 未绑定微信
	 */
	@Transactional(readOnly=false)
	public Integer loginPhone(String platform , String phone , String code) {
		/**
		 * 检查验证码
		 * 501 未发送验证码
		 * 502 验证码错误
		 * 503 验证码已过期
		 */
		Integer	result = smsService.check(SmsType.PHONE_LOGIN_TYPE,phone,code);
		if (result != 200){
			return result;
		}

		/**
		 * 检查会员
		 * 501 未找到
		 * 502 未绑定手机号
		 * 503 未绑定微信
		 * 504 已找到
		 */
		switch (check(platform,phone,null)){
			case 501:
			{
				//H5平台自动注册账号
				if(platform.equals("H5")){
					register(platform,phone,null,null,null,null);
					return 200;
				}
				return 504;
			}
			case 503:
			{
				return platform.equals("H5") ? 200 : 505;
			}
			case 504:
			{
				return 200;
			}
			default:
			{
				return 500;
			}
		}
	}

	/**
	 * 绑定手机
	 * @param platform 平台【APP或H5】
	 * @param phone 手机号
	 * @param code 验证码
	 * @param unionId 微信UnionId
	 * @param openId 微信OpenId
	 * @param avatar 微信头像
	 * @param nickName 微信昵称
	 * @return 绑定结果
	 * 500 其它
	 * 501 未发送验证码
	 * 502 验证码错误
	 * 503 验证码已过期
	 * 504 该手机已绑定其它微信
	 */
	@Transactional(readOnly=false)
	public Integer bindPhone(String platform,String phone , String code , String unionId , String openId , String avatar, String nickName) {
		/**
		 * 检查验证码
		 * 501 未发送验证码
		 * 502 验证码错误
		 * 503 验证码已过期
		 */
		Integer	result = smsService.check(SmsType.PHONE_BIND_TYPE,phone,code);
		if (result != 200){
			return result;
		}

		//手机号是否绑定其它账号
		Member member = getByPhoneOrOpenId(platform,phone,null);
		if(member != null && StringUtils.isNotBlank(member.getPhone()) && !member.getPhone().equals(phone)){
			return 504;
		}
		if(member == null){
			register(platform , phone , unionId , openId , avatar , nickName);
			return 200;
		}else{
			member.setUnionId(unionId);
			member.setOpenId(openId);
			member.setAvatar(avatar);
			member.setNickName(nickName);
			member.setIsBindPhone(true);
			super.save(member);
		}

		return 200;
	}

	/**
	 * 微信登录
	 * @param platform 平台【APP或H5】
	 * @param unionId 微信UnionId
	 * @param openId 微信OpenId
	 * @param avatar 微信头像
	 * @param nickName 微信昵称
	 * @return 登录结果
	 * 500 其它
	 * 501 未注册
	 */
	public Integer loginWechat(String platform,String unionId , String openId , String avatar, String nickName) {
		/**
		 * 检查会员
		 * 501 未找到
		 * 502 未绑定手机号
		 * 503 未绑定微信
		 * 504 已找到
		 */
		switch (check(platform,null , openId)){
			case 501:
			{
				return 501;
			}
			case 504:
			{
				return 200;
			}
			default:
			{
				return 500;
			}
		}
	}

	/**
	 * 微信绑定
	 * @param platform 平台【APP或H5】
	 * @param memberId 会员id
	 * @param unionId 微信UnionId
	 * @param openId 微信OpenId
	 * @param avatar 微信头像
	 * @param nickName 微信昵称
	 * @return 绑定结果
	 * 500 其它
	 * 501 会员id不能为空
	 * 502 会员不存在
	 * 503 该微信已绑定其它账号
	 */
	@Transactional(readOnly=false)
	public Integer bindWechat(String platform,String memberId, String unionId , String openId , String avatar, String nickName) {
		if(StringUtils.isBlank(memberId)){
			return 501;
		}

		//微信是否绑定其它账号
		Member member = getByPhoneOrOpenId(platform,null,openId);
		if(member != null && StringUtils.isNotBlank(member.getOpenId()) && !member.getOpenId().equals(openId)){
			return 503;
		}

		//会员
		 member = super.get(memberId);
		if (member == null){
			return 502;
		}

		member.setUnionId(unionId);
		member.setOpenId(openId);
		member.setAvatar(avatar);
		member.setNickName(nickName);
		member.setIsBindWechat(true);
		super.save(member);
		return 200;
	}

	/**
	 * 解绑微信
	 * @param memberId 会员id
	 * @return 解绑结果
	 * 500 其它
	 * 501 会员Id不能为空
	 * 502 会员不存在
	 */
	@Transactional(readOnly=false)
	public Integer unbindWechat(String memberId) {
		if(StringUtils.isBlank(memberId)){
			return 501;
		}

		/**
		 * 检查会员
		 * 501 未找到
		 * 502 未绑定手机号
		 * 503 未绑定微信
		 * 504 已找到
		 */
		Member member = super.get(memberId);
		if (member == null){
			return 502;
		}

		member.setUnionId("");
		member.setOpenId("");
		member.setIsBindWechat(false);
		super.save(member);
		return 200;
	}

	/**
	 * 统计汇总
	 * @param memberId 会员Id
	 * @return 统计汇总
	 */
	public Map getStatisticsById(String memberId){
		return dao.findStatisticsById(memberId);
	}

	/*
	* 修改头像
	 * @param memberId 会员Id
	 * @param avatar 头像
	* */
	@Transactional(readOnly=false)
	public Integer changeAvatar(String memberId,String avatar){
//		WebUtil.thumbnails(avatar,avatar);
		Member member = super.get(memberId);
		member.setAvatar(avatar);
		super.save(member);
		return 200;
	}

	/**
	 * 返回存储Map
	 * @param platform 平台【APP或H5】
	 * @param memberId 会员id
	 * @param phone 手机号
	 * @param openId 微信OpenId
	 * @return 解绑结果
	 * 500 其它
	 * 501 会员Id不能为空
	 * 502 会员不存在
	 */
	public Map getStorageMap(String platform,String memberId,String phone, String openId){
		Map map = new HashMap();
		Member member = null;
		if(StringUtils.isNotBlank(memberId)){
			member = super.get(memberId);
		}else if(StringUtils.isNotBlank(phone) || StringUtils.isNotBlank(openId))
		{
			member = getByPhoneOrOpenId(platform,phone,openId);
		}
		if(member == null){
			return  map;
		}
		map.put("memberId",member.getId());
		map.put("phone",member.getPhone());
		map.put("unionId",member.getUnionId());
		map.put("openId",member.getOpenId());
		map.put("avatar",member.getAvatar());
		map.put("nickName",member.getNickName());
		return map;
	}

	/**
	 * 获取会员余额
	 * @param memberId 会员id
	 * @return 会员余额
	 */
	public Double getBalance(String memberId){
		return dao.findBalanceById(memberId);
	}
}
